package com.itany.corejava.util;

import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2023年04月13日 16:24
 * 数组工具类
 */
public class ArrayUtil {

    public static void main(String[] args) {
        int[] arr = createIntArray(5, 1, 20);
        System.out.println(Arrays.toString(arr));
        int[] arr2 = new int[5];
        copyArray(arr, arr2);
        System.out.println(Arrays.toString(arr2));
        show(arr);
        change(arr, 1, 4);
        System.out.println(Arrays.toString(arr));
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }


    /**
     * 随机生成一个int类型的数组,数组的元素值不能重复
     * @param length 生成的数组程度
     * @param x      数组元素值的最小值
     * @param y      数组元素值的最大值
     * @return
     */
    public static int[] createIntArray(int length, int x, int y) {
        int[] arr = new int[length];
        for (int i = 0; i < arr.length; i++) {
            // 随机生成x-y的整数
            arr[i] = (int) (Math.random() * (y - x + 1) + x);
            // 此时随机生成的整数可能存在重复的,我们要求不能重复
            // 需要将当前生成的整数与以及存储的数组元素进行比较,判断是否已经存在
            // 只有不重复,才会加入到数组中
            for (int j = 0; j < i; j++) {
                if (arr[j] == arr[i]) {
                    // 如果存在重复的,将迭代的数组下标-1
                    // 下次再进来时与当前的下标一致
                    // 赋值后会覆盖本次操作
                    i--;
                    break;
                }
            }
        }
        return arr;
    }

    /**
     * 实现复制数组的方法,将源数组的所有元素复制到目标数组中
     * @param src  源数组
     * @param dist 目标数组
     */
    public static void copyArray(int[] src, int[] dist) {
        for (int i = 0; i < src.length; i++) {
            dist[i] = src[i];
        }
    }

    /**
     * 实现输出数组中元素的功能,要求数组的元素以短横杠-分隔
     * @param arr
     * @return
     */
    public static void show(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + "-");
            } else {
                System.out.println(arr[i]);
            }
        }
    }

    /**
     * 实现交换指定数组中指定位置的两个元素的值
     * @param arr 数组
     * @param i   交换的索引位置一
     * @param j   交换的索引位置二
     */
    public static void change(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 将指定数组的所有元素颠倒过来,倒序
     * @param arr
     */
    public static void reverse(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            int j = arr.length - 1 - i;
            change(arr, i, j);
        }
    }
}
